<?php namespace Home\Controller;
use Hdphp\Controller\Controller;
//列表页控制器
class ListController extends Controller{
	//列表页展示
	public function index(){
		//获得顶级分类  建议使用实例化模型    当pid=0时候
		$topCate = Db::table('category')->where("pid=0")->get();
		//分配数据
		View::with('topCate',$topCate);
		//1.根据当前的cid获得对应的商品的gid
		//得到cid,得到当前cid下所有的商品，包括子类
		$gids = $this->cidGetGids(Q('get.cid',0,'intval'));
		//2.根据gid找到商品属性
		//gids是个数组  
		$goodsAttr = $this->gidGetAttr($gids);
		//分配数据
		View::with('goodsAttr',$goodsAttr);
		//3.处理筛选参数param 0_0_.....
		$num = count($goodsAttr);
		$param = isset($_GET['param']) ? explode('_', $_GET['param']) : array_fill(0, $num, 0);
		//分配数据
		View::with('param',$param);
		//4.通过param参数筛选商品gid
		$resultGids = $this->filter($param,$gids);
		p($resultGids);		
		//根据$resultGids得到商品
		foreach($resultGids as $k=>$v){
			$goodsData[] = Db::table('goods')->where("gid={$v}")->get();
		}	
		//分配数据
		View::with('goodsData',$goodsData);
		p($goodsData);		
		//1.得到ID
		//$cid = Q('get.cid',0,'intval');
		//得到商品
		//if($cid){		
			//$goodsModel = new \Common\Model\Goods;
			//$goodsData = $goodsModel->where("category_cid",$cid)->get();
			//分配数据
			//View::with('goodsData',$goodsData);
			//p($goodsData);
		//}
		//载入模板
		View::make();
	}
	
	private function filter($param,$cidGids){
		//声明gids是一个数组  $param是传入的参数
		$gids = array();
		foreach ($param as $gaid) {
			if($gaid){
				//1.找到gtvalue，比如找到"红色"
				//通过goods_attr的gaid找到gavalue值
				$gavalue = Db::table('goods_attr')->where("gaid={$gaid}")->pluck('gavalue');
				//2.通过“红色”找到对应的商品id
				//通过goods_attr的gavalue找到商品的goods_gid				
				$gids[] = Db::table('goods_attr')->where("gavalue='{$gavalue}'")->lists('goods_gid');
			}
		}
		//如果点击了“不限”之外的属性		
		if($gids){ //如果$gids存在
			//取交集
			$gidsTemp = $gids[0];
			foreach ($gids as $v) {
				$gidsTemp = array_intersect($gidsTemp, $v);
			}
			//和当前分类对应的gid再次取交集
			return array_intersect($gidsTemp, $cidGids);
		}else{//如果是全部是“不限”的时候
			return $cidGids;
		}		
	}
	
	//通过gid获得商品的属性
	private function gidGetAttr($gids){  //传入的gids数组
		//gids是商品gid的集合  
		//判断goods_gid是否在这个数组   按照gavalue分组
		$data = Db::table('goods_attr')->where("goods_gid in(" . implode(',', $gids) . ")")->groupBy('gavalue')->get();
		//1.把相同类型属性id的归结在一起
		//相同类型
		$sameAttr = array();
		foreach ($data as $v) {
			$sameAttr[$v['typeattr_taid']][] = $v;
		}
		//2.组合数组
		$temp = array();
		foreach ($sameAttr as $taid => $v) {
			$temp[] = array( //从typeattr表中取数据   只取taname
				'name' => Db::table('typeattr')->where("taid={$taid}")->pluck('taname'),
				'value' => $v
			);
		}
		return $temp;		
	}
	
	//通过cid获得gid
	private function cidGetGids($cid){  //传入cid  
		//1.通过当前的cid获得对应的所有的子集cid
		//通过cid获得所有的子集cid
		$cids = $this->getSonCids(Db::table('category')->get(),$cid);
		//并且压入自己
		$cids[] = $cid;
		//2.通过子集cid查找对应的商品的gid  
		//通过cids来查找所有的商品  cids包含所有的子集cid和自己  是数组 
		//判断category_cid 是否在cids这个数组里面   得到所有的gid
		$gids = Db::table('goods')->where("category_cid in(" . implode(',', $cids) . ")")->lists('gid');
		//gids是个数组
		return $gids;
	}
	
	//递归获得指定cid的所有子集
	private function getSonCids($data,$cid){
		$temp = array();
		foreach ($data as $v) {
			if($v['pid'] == $cid){
				$temp[] = $v['cid'];
				$temp = array_merge($temp,$this->getSonCids($data, $v['cid']));
			}
		}
		return $temp;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
} 
	
?>